import java.io.*;
import java.net.Socket;
import java.util.Iterator;

/**
 * <p>Title: Serveur.ThreadServeur </p>
 *
 * <p>
 * 	Description: Cette classe donne la possibilite au serveur d'ecouter tous les clients
 *  sans se bloquer.
 * </p>
 *
 * <p>Copyright: (c) 2008 FSSIM</p>
 *
 * <p>Company: FSSImock</p>
 *
 * @author Antoine Farnault
 * @author Augustin Couette
 * @version 1.0
 */
class ThreadServeur extends Thread {

	public Socket connexion; // socket de connexion
	//private String pseudo;
	private Client client;
	BufferedReader entree; // le buffer d'entree
	/**
	 * Constructeur
	 * @param connexion la socket de communication
	 * @param pseudo
	 * @param monClient
	 */
	public ThreadServeur(Socket connexion, String pseudo, Client monClient){
		this.connexion = connexion;
		//this.pseudo = pseudo;
		this.client=monClient;
		try {
			entree = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Nouveau socket : " + connexion);
	}
	
	/**
	 * met a jour la liste des joueurs
	 */
	private void updateDisconnectedJoueurs(Client c){
		Iterator<Client> client_distant = Serveur.clients.iterator(); 
		while(client_distant.hasNext()){
			Client joueur = client_distant.next();
			try{
				Protocol.snd_joueur(joueur.pw, client.name, "disconnected", client.couleur);
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * methode de lancement du thread 
	 */
	public void run() {
		String tmp="", s;
		try {
			while( (s=entree.readLine()) != null) {
				tmp += s+"\n";
				if (s.equalsIgnoreCase("FIN")){
					StringReader sr = new StringReader(tmp);
					LineNumberReader l = new LineNumberReader(sr);
					tmp ="";
					try {
						Protocol.parser(l, client);
					}
					catch(Exception e){
						e.printStackTrace();
						System.out.println("Erreur de parsing cote serveur");
					}
				}
			}
			connexion.close();
			System.out.println("deconnexion de "+client.name);
			Serveur.clients.remove(client);
			updateDisconnectedJoueurs(client);
			//Suppression du client dans les tables
			Iterator<Table> it = Serveur.tables.iterator();
			System.out.println("nombre de table dans la salle : "+Serveur.tables.size());
			while(it.hasNext()){
				Table t = it.next();
				if (t.clients.contains(client)){
					t.clients.remove(client);
					System.out.println("Suppression de `"+client.name+"` dans la table `"+t.nom+"`");
				}
			}
			
			System.out.println("Suppression de `"+client.name+"` dans la liste des clients");
			Serveur.envoieATous(client.name+" vient de se deconnecter", "Serveur","salle",Serveur.couleur);
		}
		catch (IOException e) {
			System.err.println(e);
		}
	}
}
